[기타] 주, 서브 도메인에서의 공동 세션 값 적용.. :: PHP팁 게시판[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP팁 게시판
[1]
등록일:2007-11-26 16:20:02 (0%)
작성자:
제목:[기타] 주, 서브 도메인에서의 공동 세션 값 적용..
팁앤텍에  처음  글을  올리는데요.  
특별한  팁은  아니니  그냥  참고만  하시길...  -_-;;  


블로그  등  서비스를  제공하는  www.aaa.com  에  로긴  한  후  내  블로그  바로가기  링크  등으로  새창으로  blog.aaa.com  으로  넘어가는  경우  www.aaa.com  에서  생성한  세션은  적용되지  않습니다.  이는  가상호스트  별로  세션이  공유되지  않기  때문이죠..  


웹서버내의  호스트가  www.aaa.com  과  blog.aaa.com  및  cafe.aaa.com  등  .aaa.com  호스트들만  있다면  php.ini  의  설정  에  session.cookie_domain  =  .aaa.com  값을  줌으로써  간단하게  해결되지만  .bbb.com  등  다른  호스트들도  있다면  .bbb.com  호스트들은  세션이  먹통이  되어버리기  때문에  이  값을  사용할  수가  없습니다.  


페이지  스크립트에  
ini_set("session.cookie_domain",  ".aaa.com");  
session_set_cookie_params(3600,  "/",  ".aaa.com");  
을  달아주어도  php버젼  문제인지  적용이  되질  않더군요;  (4.3.10  입니다.)  



제가  사용하는  방법은..  

일단  blog.aaa.com  등  서브도메인  호스트의  로그인  처리,  로그아웃  처리를  www.aaa.com  호스트의  로그인,  로그아웃  파일로  처리합니다.  

우선  www.aaa.com  에서의  로긴처리페이지에서  쿠키를  2개  굽습니다.  


<?  //  www.aaa.com/loginOK.php  
setcookie("Member_ID",  $member_id,  0  ,  "/",  ".aaa.com");  
$Session_Key  =  crypt($member_id,  "keyName");  
setcookie("Session_Key",  $Session_Key,  0,  "/",  ".aaa.com");  
?>  


위의  두  쿠키는  현재  창이  닫힐  때까지  존재하고  현재  창에서  새창으로  열리는  .aaa.com  호스트에서  이를  사용할  수  있습니다.  

현재  창에서  블로그  바로가기  등  새창으로  blog.aaa.com  이  열린다고  가정하구요.  blog.aaa.com/index.html  등의  인덱스  페이지를  프레임  셋  합니다.  


<!--  blog.aaa.com/index.html  -->  
<frameset  rows="0,*"  frameborder="no"  border="0">  
    <frame  src="./hidden.php"  name="hidden"  scrolling="no"  noresize>  
    <frame  src="./index_main.php?<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>"  name="main"  scrolling="auto"  noresize>  
</frameset>  


index.html  에  get  값으로  넘어가는  변수들은  $HTTP_SERVER_VARS["QUERY_STRING"]  로  index_main.php  에  고스란히  넘길  수  있겠죠.  

히든  페이지인  hidden.php  를  다음과  같이  만들었습니다.  


<?  //  blog.aaa.com/hidden.php  
include  "../include/DBClass.php";  

if  ($_COOKIE["Member_ID"]  &&  !$_SESSION["_Member_No_"])  {  
      $Session_Key_Tmp  =  crypt($_COOKIE["Member_ID"],  "keyName");  
      if  ($Session_Key_Tmp==$_COOKIE["Session_Key"])  {  

          $info  =  $db->resultArray("Select  Member_No  From  member  Where  Member_ID='".$_COOKIE["Member_ID"]."'");  
          
          if  ($info["Member_No"])  {  
              session_register("_Member_No_");  
              session_register("_Login_Ip_");  

              $_Member_No_  =  $info["Member_No"];  
              $_Login_Ip_  =  $REMOTE_ADDR;  
          }  
      }  
}  
?>  


blog.aaa.com/index.html  가  열릴  때  hidden.php  가  먼저  엑세스  되면서  아이디쿠키가  있다면  이를  키값쿠키와  비교하여  세션을  생성시킵니다.  www.aaa.com  과  세션을  공유하는  것은  아니고  blog.aaa.com  호스트에  대한  세션이  별도로  생성되는  것이죠;;  


www.aaa.com  에  있는  로그아웃  처리파일에  다음을  추가합니다.  
(.aaa.com  의  호스트들은  로그인,  로그아웃  처리파일을  공유합니다.)  


<?  //  www.aaa.com/logout.php  
setcookie("Member_ID",  '',  0,  "/",  ".aaa.com");  
setcookie("Session_Key",  '',  0,  "/",  ".aaa.com");  

//블로그  세션  삭제  
echo  "<iframe  src='http://blog.aaa.com/logout.php'  width=0  height=0  frameborder=0></iframe>";  
?>  


위의  blog.aaa.com/logout.php  에는  다음과  같이  하면  되겠죠..  


<?  //  blog.aaa.com/logout.php  
session_start();  

if  ($_SESSION["_Member_No_"])  {  
      $_Member_No_  =  "";  
      $_Login_Ip_  =  "";  

      session_unregister("_Member_No_");  
      session_unregister("_Login_Ip_");  

      session_unset();  
      session_destroy();  
}  
?>  


그런데  여기까지  하면  문제가  발생합니다;  

blog.aaa.com/index.html  등의  인덱스  페이지가  처음  열릴때에  쿠키를  체크하여  세션을  생성하는  것이기  때문에,  이미  blog.aaa.com/index.html  페이지에  들어와  있는  상태에서  로그인하여  돌아온다면  컨텐츠  프레임만  리플레쉬  되는  것이므로  www.aaa.com  에만  세션이  생성되죠.  


그래서  로그인  처리파일에  리턴  URL  값을  체크하여  처리하는  부분을  넣어주었습니다.  


다른  서브도메인에서도  다시  돌아오기  위해  로긴  폼에서  다음의  리턴  URL  값을  넘기는데  

<input  type="hidden"  name="ReturnUrl"  value="http://<?=$HTTP_HOST.$PHP_SELF?>?<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>">  

이  값을  체크하여  $HTTP_HOST  가  blog.aaa.com  이면  세션을  생성합니다.  


<?  //  www.aaa.com/loginOK.php  
if  (eregi("blog.aaa.com",$ReturnUrl))  {  
      //블로그  세션  생성  
      echo  "<iframe  src='http://blog.allthing.co.kr/hidden.php'  width=0  height=0  frameborder=0></iframe>";  
}  
?>  


blog.aaa.com  에  히든프레임을  쓰지  않고  www.aaa.com/loginOK.php  에서  처리시  무조건  www.aaa.com  및  blog.aaa.com  세션을  생성시켜도  되지만  www.aaa.com  가  주로  상주하는  호스트이기에  blog.aaa.com  의  세션은  blog.aaa.com  에  상주하고  있을  때만  생성되면  되기에  위와  같이  하였습니다.  


그리고  blog.aaa.com  의  index.html  등의  인덱스  프레임  셋의  메인  컨텐츠  페이지인  index_main.php  을  직접  브라우저  URL  에  입력하여  들어올  수도  있으므로  index_main.php  에서  프레임을  체크할  수도  있겠죠.  


<!--  blog.aaa.com/index_main.php  -->  
<script  language="javascript">  
function  frameCheck()  {  
      if  (this==top)  document.location.replace("./<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>");  
}  
</script>  

<body  onload="frameCheck()">  


히스토리에서  지우기  위해  href  대신  replace  를  쓰면  될  듯..  


이상  제가  주도메인과  서브도메인  같이  세션  적용하는  방법이었습니다.  -_-  

태클  및  조언  환영합니다  ~.~  
  
  
  

    
      3년차  초보      06-03-10  10:48      
도메인별로  쿠키를  만들고,  접속  시에  디비  커넥션  부분에서  쿠키  체크  후,  세션  생성을  했었는데..  
단지  문제가  창  닫았을  경우  다시  열면  로그인이  되어  있는  문제가..    
  
도메인별로  쿠키를  만들고,  접속  시에  디비  커넥션  부분에서  쿠키  체크  후,  세션  생성을  했었는데..
단지  문제가  창  닫았을  경우  다시  열면  로그인이  되어  있는  문제가..  
    
      sjsjin      06-03-10  14:51      
//  내용중에  틀린게..  
ini_set("session.cookie_domain",  ".aaa.com");  
session_set_cookie_params(3600,  "/",  ".aaa.com");  
을  달아주어도  php버젼  문제인지  적용이  되질  않더군요;  (4.3.10  입니다.)  
-->  를  
session_set_cookie_params(0,  "/");  
ini_set("session.cookie_domain",  ".aaa.com");  

*  위처럼  해서  써보십시오.  
ini_set  에서  쿠키도메인을  설정했으므로  밑에서는  따로  설정할  필요가  없습니다.  
그냥  루트인  /  만  입력하면  됩니다.  
세션공유는  지금까지  위  처럼  작업했습니다만,  안되는곳은  보지  못했습니다.    
  
//  내용중에  틀린게..
ini_set("session.cookie_domain",  ".aaa.com");  
session_set_cookie_params(3600,  "/",  ".aaa.com");  
을  달아주어도  php버젼  문제인지  적용이  되질  않더군요;  (4.3.10  입니다.)  
-->  를
session_set_cookie_params(0,  "/");  
ini_set("session.cookie_domain",  ".aaa.com");  

*  위처럼  해서  써보십시오.
ini_set  에서  쿠키도메인을  설정했으므로  밑에서는  따로  설정할  필요가  없습니다.
그냥  루트인  /  만  입력하면  됩니다.
세션공유는  지금까지  위  처럼  작업했습니다만,  안되는곳은  보지  못했습니다.  
    
      TarauS      06-03-13  19:13      
예전에  제가  비슷한  문제로  고민했었던  적이  있습니다.  
그에  관련된  글의  주소를  남겨드립니다.  
http://www.phpschool.com/gnuboard4/bbs/tb.php/tipntech/19298    
  
예전에  제가  비슷한  문제로  고민했었던  적이  있습니다.
그에  관련된  글의  주소를  남겨드립니다.
http://www.phpschool.com/gnuboard4/bbs/tb.php/tipntech/19298  
    
      너만사랑해      06-04-30  00:19      
마침  필요하던  자료네요..ㄳ~    
[본문링크] [기타] 주, 서브 도메인에서의 공동 세션 값 적용..
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=1174
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.